package com.zp.pattern.dynamicProxy2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * 动态代理类：代理对象：$Proxy0(使用反射生成的代理对象，该对象实现了Library接口)
 * 
 * 该代理类的内部属性是Object类型，实际使用的时候通过该类的bind()方法传递进来一个委托对象，
 * 返回该委托的代理实例，此外，该类还实现了invoke方法，该方法中的method.invoke其实就是
 * 调用被代理对象的将要执行的方法，方法参数是target和args，表示调用target实例的方法，
 * 该方法的参数是args，通过动态代理类，我们可以在执行委托的方法前后加入自己的一些额外方法。
 */
public class DynamicLibraryProxy implements InvocationHandler {
	//委托类型的引用：Object类型，可以传入任何类型；
	private Object target;
	
	//绑定委托对象，并返回该委托的代理的实例
	public Object bind(Object obj){
		this.target = obj;
		//创建代理对象:$Proxy0，通过委托对象来创建代理对象;
		//该代理对象实现了委托对象实现的所有接口：obj.getClass().getInterfaces();
		//this代表当前对象;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				obj.getClass().getInterfaces(),this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		System.out.println("代理类事务处理之前方法。。。。");
		result = method.invoke(target,args);
		System.out.println("代理类事物处理之后方法。。。。");
		return result;
	}
}
